import { AttributeType } from "../core/AttributeSystem";
import { UNIT_CATEGORY } from "../attr/EnumAttr";

// Buff配置接口
export interface IBuffConfig {
    id: number;                      // BuffID
    name: string;                    // Buff名称
    icon: string;                    // Buff图标
    description: string;             // Buff描述
    
    // 效果类型
    buffType: BuffType;              // Buff类型
    isDebuff: boolean;               // 是否为Debuff
    
    // 时间设置
    duration: number;                // 持续时间(秒)
    tickInterval?: number;           // 触发间隔(秒)
    
    // 叠加设置
    maxStacks: number;               // 最大叠加层数
    stacksAddMode: StackAddMode;     // 叠加方式
    
    // 作用目标
    targetCategories: UNIT_CATEGORY[]; // 可影响的目标类别
    targetSelf: boolean;             // 是否作用于自身
    
    // 效果设置
    effects: IBuffEffectConfig[];    // 效果列表
    
    // 视觉表现
    visual: {
        applyFX?: string;            // 应用特效
        loopFX?: string;             // 循环特效
        endFX?: string;              // 结束特效
        scaleFX?: number;            // 特效缩放
        attachPoint?: number;        // 附加点
    };
    
    // 高级设置
    dispellable: boolean;            // 是否可驱散
    hidden: boolean;                 // 是否隐藏
    exclusive: boolean;              // 是否排他
    exclusiveGroup?: number;         // 排他组
    priority: number;                // 优先级
}

// Buff效果配置
export interface IBuffEffectConfig {
    effectType: BuffEffectType;      // 效果类型
    timing: BuffEffectTiming;        // 效果触发时机
    
    // 属性修改
    attributeModifiers?: {
        attribute: AttributeType;    // 属性类型
        value: number;               // 修改值
        isPercent: boolean;          // 是否百分比
        perStack: boolean;           // 是否按叠加层数
    }[];
    
    // 伤害/治疗
    damageType?: number;             // 伤害类型
    damageValue?: number;            // 伤害值
    damageFormula?: string;          // 伤害公式
    
    // 控制效果
    controlType?: ControlType;       // 控制类型
    controlParams?: number[];        // 控制参数
    
    // 特殊效果
    specialEffect?: SpecialEffectType; // 特殊效果类型
    specialParams?: any[];           // 特殊参数
}

// Buff类型枚举
export enum BuffType {
    ATTRIBUTE = 0,   // 属性修改
    PERIODIC = 1,    // 周期性
    CONTROL = 2,     // 控制效果
    SHIELD = 3,      // 护盾
    SPECIAL = 4,     // 特殊效果
    AURA = 5,        // 光环效果
}

// 叠加方式枚举
export enum StackAddMode {
    REPLACE = 0,     // 替换
    DURATION = 1,    // 延长持续时间
    INTENSITY = 2,   // 增加强度
    INDEPENDENT = 3, // 独立计算
}

// Buff效果类型枚举
export enum BuffEffectType {
    ATTRIBUTE_MODIFY = 0, // 属性修改
    DAMAGE = 1,          // 伤害
    HEAL = 2,            // 治疗
    CONTROL = 3,         // 控制效果
    SPECIAL = 4,         // 特殊效果
    TRIGGER_SKILL = 5,   // 触发技能
}

// Buff效果触发时机枚举
export enum BuffEffectTiming {
    ON_APPLY = 0,    // 应用时
    ON_TICK = 1,     // 周期触发
    ON_REMOVE = 2,   // 移除时
    ON_DAMAGED = 3,  // 受伤时
    ON_ATTACK = 4,   // 攻击时
    ON_SKILL = 5,    // 使用技能时
}

// 控制类型枚举
export enum ControlType {
    NONE = 0,        // 无
    STUN = 1,        // 眩晕
    ROOT = 2,        // 定身
    SILENCE = 3,     // 沉默
    SLOW = 4,        // 减速
    KNOCKBACK = 5,   // 击退
    PULL = 6,        // 拉近
    FEAR = 7,        // 恐惧
    TAUNT = 8,       // 嘲讽
}

// 特殊效果类型枚举
export enum SpecialEffectType {
    NONE = 0,            // 无
    IMMUNE = 1,          // 免疫
    REFLECT = 2,         // 反弹
    INVISIBLE = 3,       // 隐身
    INVULNERABLE = 4,    // 无敌
    LIFE_STEAL = 5,      // 吸血
    COOLDOWN_REDUCTION = 6, // 冷却减少
    COST_REDUCTION = 7,  // 消耗减少
    THORNS = 8,          // 荆棘
}

// Buff配置管理器
export class BuffConfigManager {
    private static _instance: BuffConfigManager;
    
    private _buffConfigs: Map<number, IBuffConfig> = new Map();
    
    private constructor() {
        // 初始化逻辑
    }
    
    public static get instance(): BuffConfigManager {
        if (!this._instance) {
            this._instance = new BuffConfigManager();
        }
        return this._instance;
    }
    
    // 加载Buff配置
    public loadBuffConfigs(configs: any[]): void {
        configs.forEach(config => {
            this._buffConfigs.set(config.id, config);
        });
    }
    
    // 获取Buff配置
    public getBuffConfig(id: number): IBuffConfig {
        return this._buffConfigs.get(id);
    }
    
    // 获取所有Debuff
    public getAllDebuffs(): IBuffConfig[] {
        const result: IBuffConfig[] = [];
        this._buffConfigs.forEach(config => {
            if (config.isDebuff) {
                result.push(config);
            }
        });
        return result;
    }
    
    // 获取所有Buff
    public getAllBuffs(): IBuffConfig[] {
        const result: IBuffConfig[] = [];
        this._buffConfigs.forEach(config => {
            if (!config.isDebuff) {
                result.push(config);
            }
        });
        return result;
    }
    
    // 获取特定类型的Buff
    public getBuffsByType(type: BuffType): IBuffConfig[] {
        const result: IBuffConfig[] = [];
        this._buffConfigs.forEach(config => {
            if (config.buffType === type) {
                result.push(config);
            }
        });
        return result;
    }
    
    // 获取特定控制类型的Buff
    public getBuffsByControlType(controlType: ControlType): IBuffConfig[] {
        const result: IBuffConfig[] = [];
        this._buffConfigs.forEach(config => {
            const hasControlEffect = config.effects.some(effect => 
                effect.effectType === BuffEffectType.CONTROL && 
                effect.controlType === controlType
            );
            
            if (hasControlEffect) {
                result.push(config);
            }
        });
        return result;
    }
} 